package com.qf.index;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.db.Db;
import cn.hutool.db.Entity;
import cn.hutool.json.JSON;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {

    public static void main(String[] args) throws SQLException {
//        String newDataName = "scholar_25_02.";
//        String summaryFundTable = newDataName + "unified_search_summary_0120_fund";
//        String summaryTable = newDataName + "unified_search_summary_0120_old";
//        String titleTransTable = newDataName + "basic_fund_guidelines_title_trans";
//
////        insertTitleTransTable(summaryTable, "id", "ut`,`title`,`cn_ti`,`year`,`pmId", 0, 100, titleTransTable, summaryFundTable);
//
////        String ti = "RETRACTED: Naringin Promotes Osteogenic/Odontogenic Differentiation of Dental Pulp Stem Cells via Wnt/<i>β</i>-Catenin (Retracted Article)";
////        String f = ti.startsWith("被撤回的出版物:") || ti.startsWith("RETRACTED:") ? "被撤回的出版物: " : "";
////        f = ti.startsWith("撤稿声明:") ? "撤稿声明: " : f;
////        System.out.println(f);
//
//        List<Integer> list=new ArrayList<>();
//        list.parallelStream().forEach(aid->{
//            /**
//             * 内部的逻辑运算
//             */
//        });

        String user = "Bearer sk-06a0675779c944b6a4d5b893cb3cc89a";
        String question = "Xinxiang Medical University, Henan Collaborat Innovat Center Molecular Diagnosis & Laboratories Medical, Xinxiang, Henan, People's Republic of China";
        String content = "发表SCI论文一般都会署名作者所属的单位和部门，请检查论文作者信息：\"" + question + "\" 中是否包含新乡医学院附属的医院或下属的部门名称，并将其与已知的52个标准附属医院或下属部门名称进行匹配。如果匹配成功，请返回标准名称，如果不能完全匹配成功，而是近似匹配成功的，请在匹配的名称上加上英文的方括号，如果有多个可能的匹配项，选择最接近的一个。若无任何名称匹配，则将识别到的附属医院或下属部门的名称加上英文的括号后返回。可以参考的标准名称名单：网络与信息中心 - 图书馆（档案馆） - 期刊社 - 临床医学学部 - 人文社会科学学部 - 药学学部 - 峻极书院 - 弘毅书院 - 基础医学院 - 公共卫生学院 - 药学院 - 医学技术学院 - 护理学院 - 卫生健康管理学院 - 法医学院 - 生命科学技术学院 - 心理学院 - 外语学院 - 医学工程学院 - 马克思主义学院 - 医学人文学院 - 体育学院 - 国际教育学院 - 继续教育学院 - 河南省心理咨询中心 - 河南省神经病学研究所 - 河南省科技期刊研究中心 - 健康中原研究院 - 新乡医学院结核病研究所 - 新乡医学院心血管疾病研究所 - 河南省高等医学教育发展研究中心 - 河南省分子诊断与医学检验技术协同创新中心 - 精神疾病中西医结合临床医学中心 - 新乡医学院组织工程与再生临床医学中心 - 河南省生物精神病学重点实验室 - 河南省医用组织再生重点实验室 - 河南省神经修复重点实验室 - 河南省免疫与靶向药物重点实验室 - 精神神经医学研究院 - 第一附属医院 - 第二附属医院 - 第三附属医院 - 附属中心医院 - 附属人民医院 - 附属濮阳市油田总医院 - 附属焦作市人民医院 - 附属濮阳市人民医院 - 附属濮阳市安阳地区医院 - 附属开封市中心医院 - 附属郑州市第一人民医院 - 附属郑州市第七人民医院 - 附属安阳市人民医院。请返回标准的JSON的数据格式：{\"name\":\"\"}";
        String api = TongYiApi.api(content, user);
        Matcher matcher = Pattern.compile("\"name\"\\s*:\\s*\"([^\"]*)\"").matcher(api);
        String name = matcher.find() ? matcher.group(1).trim() : "";
        System.out.println("name:" + name);

    }

    public static void insertTitleTransTable(String summaryTable, String autoId, String field, int min, int max, String titleTransTable, String summaryFundTable) throws SQLException {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        int onePageNum = 10000;
        List<Entity> tableNum = Db.use().query("select count(1) as count from " + summaryTable);
        if (tableNum.get(0).getInt("count") > 0) {
            int tableMax = Db.use().queryNumber("select max(" + autoId + ") from " + summaryTable).intValue();
            Collection<Integer> tableList = new ArrayList<>();
            NumberUtil.appendRange(0, tableMax + onePageNum, onePageNum, tableList);
            for (Integer startId : tableList) {
                List<Entity> tableData = Db.use().query("select `" + autoId + "`,`" + field + "` from " + summaryTable + " where " + autoId + " between " + startId + " and " + (startId + onePageNum - 1));
                System.out.println("\033[31;1m" + format.format(new Date()) + " 读表现在开始：" + startId + " 表名：" + summaryTable + Utils.printMemoryStr() + "\033[0m");
                for (Entity entry : tableData) {
                    int id = Utils.getIntField(entry, autoId);
                    int end = id > 10 ? Integer.parseInt(Integer.toString(id).substring(Integer.toString(id).length() - 2)) : id;
                    int year = Utils.getIntField(entry, "year");
                    int pmId = Utils.getIntField(entry, "pmId");
                    String ut = Utils.getStrField(entry, "ut");
                    if (year > 2017 && (pmId > 0 || ut.length() >= 15) && (end >= min && end <= max)) {
                        String title = Utils.getStrField(entry, "title");
                        String cnTi = Utils.getStrField(entry, "cn_ti");
                        if (title.length() > 3 && cnTi.length() < 4) {
                            String ti = title.trim();
                            ti = ti.startsWith("[") && ti.endsWith("].") ? ti.substring("[".length(), ti.length() - "].".length()).trim() : ti;
                            ti = ti.startsWith("[") && ti.endsWith("]") ? ti.substring("[".length(), ti.length() - "]".length()).trim() : ti;
                            ti = Pattern.compile("<[^>]*>").matcher(ti).find() ? Jsoup.parse(ti).text().trim() : ti;
                            String f = ti.startsWith("被撤回的出版物:") || ti.startsWith("RETRACTED:") ? "被撤回的出版物: " : "";
                            f = ti.startsWith("撤稿声明:") ? "撤稿声明: " : f;
                            ti = ti.startsWith("被撤回的出版物:") ? ti.substring("被撤回的出版物:".length()).trim() : ti;
                            ti = ti.startsWith("撤稿声明:") ? ti.substring("撤稿声明:".length()).trim() : ti;
                            ti = ti.startsWith("RETRACTED:") ? ti.substring("RETRACTED:".length()).trim() : ti;
                            String trans = TransApi.youDaoEnToCnTrans(ti);
                            if (trans.length() > 3) {
                                try {
                                    Db.use().insert(Entity.create(titleTransTable).set("ut", ut).set("pm", pmId).set("ti", ti).set("title", title).set("cn_ti", "ĺļ" + f + trans));
                                } catch (SQLException e) {
                                    e.printStackTrace();
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    public static Set<String> getUtSet(String summaryFundTable, String autoId, String field) throws SQLException {
        int onePageNum = 1000;
        Set<String> utSet = new HashSet<>();
        List<Entity> tableNum = Db.use().query("select count(1) as count from " + summaryFundTable);
        if (tableNum.get(0).getInt("count") > 0) {
            int tableMax = Db.use().queryNumber("select max(" + autoId + ") from " + summaryFundTable).intValue();
            Collection<Integer> tableList = new ArrayList<>();
            NumberUtil.appendRange(0, tableMax + onePageNum, onePageNum, tableList);
            for (Integer startId : tableList) {
                List<Entity> tableData = Db.use().query("select `" + autoId + "`,`" + field + "` from " + summaryFundTable + " where " + autoId + " between " + startId + " and " + (startId + onePageNum - 1));
                for (Entity entry : tableData) {
                    String ut = entry.getStr("ut");
                    if (null != ut && !ut.isEmpty()) {
                        utSet.add(ut);
                    }
                }
            }
        }
        return utSet;
    }


}
